package abstactClassInterfaceCodeKuai02;

//类的五大成原       属性   方法    构造方法  代码块    内部类
//抽象类的五大成原   属性  抽象方法  构造方法  代码块    内部类
//接口的五大成原     常量  抽象方法  默认方法 静态方法  私有方法


public abstract class Animal {
    private String name;
    private int age;
	
	/* 代码块四种类型
	1.普通代码块(局部内部类)
	2.构造代码块 每次创建对象时都会执行一次(就是在类中的局部内部类)
	3.静态代码块 只用第一次加载类时执行一次(只能用一次的构造代码块)
	4.同步代码块 (暂时不用学，多线程的时候会用到)
	 */

    {
        System.out.println("构造代码块,看看我执行几次");
    }

    static {
        System.out.println("静态代码块\n");
        //当类加载时，静态代码块会执行一次，且只执行一次，后续创建对象时不会执行
        //如果没有前面的static，就是构造代码块，每次创建对象时都会执行一次
    }

    public Animal() {
        this("无名", 1);
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
		/*
		加了abstract关键字，这个方法就是抽象方法，抽象方法没有方法体(没有“{}”)
		子类必须重写父类的所有抽象方法，否则子类也必须是抽象类，
		含有抽象方法的类一定是抽象类，要在class前面加abstract关键字
		抽象类不能实例化对象，抽象类可以有构造方法，但是构造方法不能实例化对象
	    抽象类的子类必须重写父类的所有抽象方法，否则子类也必须是抽象类
		 
		抽象类存在意义就是要让子类重写父类的方法名字必须一样
		不要在子类中写另一个方法，否则会报错
		*/
}
